package top.frsf.action;

import java.util.Map;
import java.util.WeakHashMap;

/**
 * @author He Kuntao
 * @since 2025/8/5 11:29
 */
public interface TimeMoveAble {
    /**
     * 间隔MAP
     */
    Map<TimeMoveAble, Long> CD_MAP = new WeakHashMap<>();

    /**
     * 上次时间MAP
     */
    Map<TimeMoveAble, Long> LAST_CD_TIME_MAP = new WeakHashMap<>();

    /**
     * 获取间隔
     *
     * @return 攻击间隔
     */
    default long getMoveCd() {
        return CD_MAP.getOrDefault(this, 1000L);
    }

    /**
     * 设置间隔
     *
     * @param cd 间隔
     */
    default void setMoveCd(long cd) {
        CD_MAP.put(this, cd);
    }

    /**
     * 获取上次时间
     *
     * @return 上次时间
     */
    default long getLastMoveTime() {
        return LAST_CD_TIME_MAP.getOrDefault(this, 0L);
    }

    /**
     * 设置最后攻击时间
     *
     * @param time 最后攻击时间
     */
    default void setLastMoveTime(long time) {
        LAST_CD_TIME_MAP.put(this, time);
    }

    /**
     * 攻击模板方法
     */
    default void move() {
        if (canMove()) {
            performMove();
            setLastMoveTime(System.currentTimeMillis());
        }
    }

    /**
     * 是否可以进行动作
     *
     * @return ture-可以攻击，反之false
     */
    default boolean canMove() {
        return System.currentTimeMillis() - getLastMoveTime() >= getMoveCd();
    }

    /**
     * 具体行为，需要实现类提供
     */
    void performMove();
}
